package negocios.fachada;

import negocios.Cliente;
import negocios.CompraCliente;
import negocios.CompraEstoque;
import negocios.Contato;
import negocios.Debito;
import negocios.Despesa;
import negocios.Endereco;
import negocios.Fornecedor;
import negocios.Funcionario;
import negocios.Produto;
import negocios.Usuario;
import negocios.controladores.ControladorCliente;
import negocios.controladores.ControladorCompraCliente;
import negocios.controladores.ControladorCompraEstoque;
import negocios.controladores.ControladorContato;
import negocios.controladores.ControladorDebito;
import negocios.controladores.ControladorDespesa;
import negocios.controladores.ControladorEndereco;
import negocios.controladores.ControladorFornecedor;
import negocios.controladores.ControladorFuncionario;
import negocios.controladores.ControladorProduto;
import negocios.controladores.ControladorUsuario;
import negocios.excecoes.GestockException;

public class Fachada {

	private static Fachada instancia = null;

	private ControladorContato conContato = null;
	private ControladorEndereco conEndereco = null;
	private ControladorCliente conCliente = null;
	private ControladorFuncionario conFuncionario = null;
	private ControladorFornecedor conFornecedor = null;
	private ControladorProduto conProduto = null;
	private ControladorCompraCliente conCompraCliente = null;
	private ControladorCompraEstoque conCompraEstoque = null;
	private ControladorDespesa conDespesa = null;
	private ControladorUsuario conUsuario = null;
	private ControladorDebito conDebito = null;

	public static Fachada getInstancia() {
		if (instancia == null) {
			instancia = new Fachada();
		}
		return instancia;
	}

	public Fachada() {
		conContato = new ControladorContato();
		conEndereco = new ControladorEndereco();
		conCliente = new ControladorCliente();
		conFuncionario = new ControladorFuncionario();
		conFornecedor = new ControladorFornecedor();
		conProduto = new ControladorProduto();
		conCompraCliente = new ControladorCompraCliente();
		conCompraEstoque = new ControladorCompraEstoque();
		conDespesa = new ControladorDespesa();
		conDebito = new ControladorDebito();
		conUsuario = new ControladorUsuario();

	}

	// Contato

	public void CadastrarContato(Contato contato) throws GestockException {
		conContato.cadastrarContato(contato);
	}

	public void AlterarContato(Contato contato) throws GestockException {
		conContato.alterarContato(contato);
	}

	public Contato ConsultaContato(String idContato) throws GestockException {
		return conContato.consultarContato(idContato);
	}

	// Endereco

	public void CadastrarEndereco(Endereco endereco) throws GestockException {
		conEndereco.cadastrarEndereco(endereco);
	}

	public void AlterarEndereco(Endereco endereco) throws GestockException {
		conEndereco.alterarEndereco(endereco);
	}

	public Endereco ConsultaEndereco(String idEndereco) throws GestockException {
		return conEndereco.consultarEndereco(idEndereco);
	}

	// Cliente

	public void CadastrarCliente(Cliente cliente, Contato contato,
			Endereco endereco) throws GestockException {
		conCliente.cadastrarCliente(cliente, contato, endereco);
	}

	public void AlterarCliente(Cliente cliente) throws GestockException {
		conCliente.alterarCliente(cliente);
	}

	public Cliente ConsultaCliente(String idCliente) throws GestockException {
		return conCliente.consultarCliente(idCliente);
	}

	public Object[][] ListarClientes(String nome) throws GestockException {
		return conCliente.listarClientes(nome);
	}

	// Funcionario

	public void CadastrarFuncionario(Funcionario funcionario, Contato contato,
			Endereco endereco) throws GestockException {
		conFuncionario.cadastrarFuncionario(funcionario, contato, endereco);
	}

	public void AlterarFuncionario(Funcionario funcionario)
			throws GestockException {
		conFuncionario.alterarFuncionario(funcionario);
	}

	public Funcionario ConsultaFuncionario(String nome) throws GestockException {
		return conFuncionario.consultarFuncionario(nome);
	}

	public Object[][] ListarFuncionarios(String nome) throws GestockException {
		return conFuncionario.listarFuncionarios(nome);
	}

	// Fornecedor

	public void CadastrarFornecedor(Fornecedor fornecedor, Contato contato,
			Endereco endereco) throws GestockException {
		conFornecedor.cadastrarFornecedor(fornecedor, contato, endereco);
	}

	public void AlterarFornecedor(Fornecedor fornecedor)
			throws GestockException {
		conFornecedor.alterarFornecedor(fornecedor);
	}

	public Fornecedor ConsultaFornecedor(String nome) throws GestockException {
		return conFornecedor.consultarFornecedor(nome);
	}

	public Object[][] ListarFornecedor() throws GestockException {
		return conFornecedor.listarFornecedor();
	}

	public Object[][] ListarFornecedorJTable(String nome)
			throws GestockException {
		return conFornecedor.listarFornecedorJTable(nome);
	}

	// Produto

	public void CadastrarProduto(Produto produto) throws GestockException {
		conProduto.cadastrarProduto(produto);
	}

	public void AlterarProduto(Produto produto) throws GestockException {
		conProduto.alterarProduto(produto);
	}

	public Produto ConsultaProduto(String idProduto) throws GestockException {
		return conProduto.consultarProduto(idProduto);
	}

	public void IncrementarQuantidadeProduto(String idProduto, String quantidade)
			throws GestockException {
		conProduto.incrementarQuantidadeProduto(idProduto, quantidade);
	}

	public void AlterarQuantidadeProduto(String idProduto, String quantidade)
			throws GestockException {
		conProduto.alterarQuantidadeProduto(idProduto, quantidade);
	}

	public Object[][] ListarProduto(String nome) throws GestockException {
		return conProduto.listarProduto(nome);
	}

	public Object[][] AdicionarProdutoAListaDeCompras(
			Object[][] produtosListaDeCompras, Produto produto,
			String valorTotal, String quantidade) throws GestockException {
		return conProduto.adicionarProdutoAListaDeCompras(
				produtosListaDeCompras, produto, valorTotal, quantidade);
	}

	public Object[][] RemoverProdutoDaListaDeCompras(
			Object[] produtoListaDeCompras, Object[][] produtosListaDeCompras)
			throws GestockException {
		return conProduto.removerProdutoDaListaDeCompras(produtoListaDeCompras,
				produtosListaDeCompras);
	}

	// CompraCliente

	public void CadastrarCompraCliente(CompraCliente compraCliente)
			throws GestockException {
		conCompraCliente.cadastrarCompraCliente(compraCliente);
	}

	public CompraCliente ConsultaCompraCliente(int quantidade)
			throws GestockException {
		return conCompraCliente.consultarCompraCliente(quantidade);
	}

	// CompraEstoque

	public void CadastrarCompraEstoque(CompraEstoque compraEstoque)
			throws GestockException {
		conCompraEstoque.cadastrarCompraEstoque(compraEstoque);
	}

	public CompraEstoque ConsultaCompraEstoque(int quantidade)
			throws GestockException {
		return conCompraEstoque.consultarCompraEstoque(quantidade);
	}

	// Despesa

	public void CadastrarDespesa(Despesa despesa) throws GestockException {
		conDespesa.cadastrarDespesa(despesa);
	}

	public void AlterarDespesa(Despesa despesa) throws GestockException {
		conDespesa.alterarDespesa(despesa);
	}

	public Despesa ConsultaDespesa(String descricao) throws GestockException {
		return conDespesa.consultarDespesa(descricao);
	}

	// Debito

	public void CadastrarDebito(Debito debito) throws GestockException {
		conDebito.cadastrarDebito(debito);
	}

	public void AlterarDebito(Debito debito) throws GestockException {
		conDebito.alterarDebito(debito);
	}

	public void AlterarDataPagoDebito(String DataPago, int idDebito)
			throws GestockException {
		conDebito.alterarDataPagoDebito(DataPago, idDebito);
	}

	public Debito ConsultaDeposito(String idDebito) throws GestockException {
		return conDebito.consultarDebito(idDebito);
	}

	public Object[][] ListarDebitos() throws GestockException {
		return conDebito.listarDebitos();
	}

	// Usuario

	public void CadastrarUsuario(Usuario usuario, Funcionario funcionario)
			throws GestockException {
		conUsuario.cadastrarUsuario(usuario, funcionario);
	}

	public void ApagarUsuario(int idAcesso) throws GestockException {
		conUsuario.apagarUsuario(idAcesso);
	}

	public void AlterarUsuario(Usuario usuario) throws GestockException {
		conUsuario.alterarUsuario(usuario);
	}

	public void AlterarSenhaUsuario(int idAcesso, String senha)
			throws GestockException {
		conUsuario.alterarSenhaUsuario(idAcesso, senha);
	}

	public Usuario ConsultaUsuario(String usuario) throws GestockException {
		return conUsuario.consultarUsuario(usuario);
	}

	public Usuario ConsultaUsuario2(String idFuncionario)
			throws GestockException {
		return conUsuario.consultarUsuario2(idFuncionario);
	}

	public boolean ValidaUsuario(String usuario, String senha)
			throws GestockException {
		return conUsuario.validaUsuario(usuario, senha);
	}

	public boolean VerificaExistenciaDeUsuario(String usuario)
			throws GestockException {
		return conUsuario.verificaExistenciaDeUsuario(usuario);
	}

}
